package ccxz.biz.application.util;

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;

/**
 * GraphicsUtil
 *
 * @author KV
 * @since 2022/11/16
 */
public class GraphicsUtil {

    /**
     * 绘制自动换行文本
     *
     * @param g     {@link Graphics2D}
     * @param str   文本
     * @param x     坐标X
     * @param y     坐标Y
     * @param width 总宽度
     */
    public static void drawWrapString(Graphics2D g, String str, int x, int y, int width) {
        drawWrapString(g, str, x, y, width, null, null);
    }

    /**
     * 绘制自动换行文本
     *
     * @param g          {@link Graphics2D}
     * @param str        文本
     * @param x          坐标X
     * @param y          坐标Y
     * @param width      总宽度
     * @param lineHeight 每行高度（为空时取字号大小）
     */
    public static void drawWrapString(Graphics2D g, String str, int x, int y, int width, Integer lineHeight) {
        drawWrapString(g, str, x, y, width, lineHeight, null);
    }

    /**
     * 绘制自动换行文本
     *
     * @param g          {@link Graphics2D}
     * @param str        文本
     * @param x          坐标X
     * @param y          坐标Y
     * @param width      总宽度
     * @param lineHeight 每行高度（为空时取字号大小）
     * @param maxLine    最大行数
     */
    public static void drawWrapString(Graphics2D g, String str, int x, int y, int width, Integer lineHeight, Integer maxLine) {
        if (g == null) {
            return;
        }
        Font font = g.getFont();
        FontMetrics fontMetrics = new JLabel(str).getFontMetrics(font);
        if (lineHeight == null) {
            lineHeight = font.getSize();
        }
        char[] chars = str.toCharArray();
        List<StringBuilder> lines = new ArrayList<>();
        int s = 0;
        StringBuilder p = null;
        for (char c : chars) {
            int cWidth = fontMetrics.stringWidth(c + "");
            if (p == null || s + cWidth >= width) {
                p = new StringBuilder();
                lines.add(p);
                s = cWidth;
            } else {
                s += cWidth;
            }
            p.append(c);
        }
        maxLine = maxLine == null ? lines.size() : Math.min(lines.size(), maxLine);
        for (int i = 0; i < maxLine; i++) {
            g.drawString(lines.get(i).toString(), x, y + ((i + 1) * (lineHeight)));
        }
    }
}